Испод хаубе: основна структура PyGame програма¶
У овом поглављу ћемо описати помоћне („сиве”) делове кода. Од тебе се не очекује да умеш да овај кôд напишеш самостално (увек можеш да кренеш од унапред припремљеног кода), тако да читање поглавља слободно можеш да прескочиш (осим ако те занима да детаљно разумеш како ради цео програм).
Прикажимо један комплетан пример програма у којем се у прозору црта дијагонално постављена дуж и прозор се затвара након пет секунди. У овом примеру се користи само библиотека PyGame (не и библиотека PyGameBg). Наредбе за цртање налазе се у делу кода са белом позадином, где можете да мењате вредности параметара или додајете нове наредбе.
Кôд који је приказан делује веома сложено. Наиме, да би се направио програм у коме се извршава цртање уз помоћу библиотеке PyGame, потребно је извршити неколико важних корака.
У наставку ћемо их само површно објаснити, а њихов детаљан опис даћемо тек касније. У првим програмима које ћемо писати тај кôд ће увек бити исти и немаш потребе да га детаљно анализираш, разумеваш и мењаш. Дакле, немој се уплашити ако ти текст који следи делује прилично компликовано. Неке ствари од тога нећеш никада морати детаљно да научиш, а неке ћеш полако научити током дружења са библиотеком PyGame. И у овом и у наредним примерима унапред ћемо ти припремити део кода на који не треба да обраћаш посебну пажњу. Тај кôд ће бити мало затамњен и нећеш моћи да га мењаш.
Иницијализација и искључивање рада библиотеке¶
Програми у којима се користи библиотека PyGame обично имају следећи скелет:
На почетку се кроз линију import pygame as pg
наглашава да ће у
програму бити коришћена библиотека PyGame и задаје јој се скраћени
назив pg
, да би се њена функционалност у наставку могла користити
помоћу pg.
уместо помоћу pygame.
, што би био случај да нисмо
навели as pg
(на пример, уместо pg.init()
, морали бисмо писати
pygame.init()
). На почетку програма укључујемо тј. иницијализујемо
библиотеку помоћу позива pg.init()
, док на самом крају програма
искључујемо њен рад помоћу позива pg.quit()
.
Отварање прозора¶
Наредни корак у програму је отварање прозора у којем ће се вршити исцртавање.
Прва линија позива функцију pg.display.set_caption()
која поставља
наслов прозора на текст који се задаје као аргумент (подсетимо се,
текст, било написан ћирилицом, било латиницом наводи се у облику ниске
карактера, тј. стринга, унутар једноструких или двоструких наводника -
нпр. 'Наслов прозора'
или "Наслов прозора"
). Функција
pg.display.set_mode()
укључује приказ прозора, а аргумент јој је
уређени пар који садржи димензије тог прозора у пикселима (ширину и
висину). Пошто ћемо димензије прозора често користити за израчунавање
положаја неких објеката, добра пракса је да се пре позива
pg.display.set_mode()
те димензије запамте у две променљиве
(обично ћемо их називати sirina
и visina
). Наравно, могуће је
било димензије навести у облику константи pg.display.set_mode(400,
400)
. Функција pg.display.set_mode
враћа вредност коју је веома
важно упамтити (за то ћемо обично користити променљиву prozor
),
јер ће та вредност у наставку бити коришћена за свако цртање по
прозору.
Цртање¶
Наредни блок одређује оно што ће се цртати и он се разликује од програма до програма. У првом делу приручника, усредсредићемо се управо на тај део програма, док ће остатак увек изгледати веома слично (у неким примерима ћемо га чак и затамнити, тако да не можеш да га мењаш).
Прва линија проузрокује да се позадина прозора обоји у белу боју
(функција prozor.fill()
проузрокује бојење позадине, док је
pg.Color("white")
позив функције који враћа белу боју). Друга
линија проузрокује цртање дужи. Дуж се црта помоћу функције
pygame.draw.line()
, чији су аргументи редом прозор на ком се црта
(у нашем случају то је променљива prozor
чија је вредност
постављена позивом функције pygame.display.set_mode()
), затим боја
(у нашем случају то је црна боја добијена позивом
pg.Color("black")
), затим координате почетне и крајње тачке дужи
(у нашем случају почетна тачка је (100, 100)
, а крајња је (300,
300)
) и на крају дебљина линије (у нашем случају то је
5
). Детаљни преглед координатног система, начина задавања боја и
функција за цртање биће дат у наставку приручника.
Позиви функција за цртање (ми смо користили fill()
и
draw.line()
) нису довољне да би се слика приказала на екрану. Да
би се слика нацртала на екрану, потребно је позвати функцију
pg.display.update()
, која проузрокује освежавање прозора (или
евентуално неког његовог правоугаоног дела описаног кроз аргумент
позива те функције, што може бити брже када се слика на екрану брзо
мења, а што ће нам бити релевантно само у случају анимација о којима
ће више речи бити касније). Уместо pg.display.update()
могуће је
позвати и pg.display.flip()
.
Након исцртавања налази се наредба pg.time.wait(5000)
којом се
програм паузира на пет секунди (ова функција очекује број милисекунди,
па, пошто у једној секунди има 1000 милисекунди, пет секунди се задаје
као 5000). Након паузе се долази до наредбе за искључивање рада
библиотеке (самим тим и искључивање рада прозора). Много лепше решење
од овога би било да се кориснику омогући да он искључи прозор када то
пожели. Приметимо и да је током паузе програм потпуно замрзнут и да не
реагује ни на какве акције корисника (током паузе не можемо чак ни да
искључимо прозор).
Постоји неколико уобичајених начина да се ово понашање исправи и сви су засновани на концепту догађаја и њихове обраде.
Догађаји и њихова обрада¶
Програми са графичким корисничким интерфејсом су обично руковођени тзв. догађајима. Догађаји могу бити разни: померање миша, клик неким дугметом миша, притисак тастера на тастатури, искључивање прозора и слично. Програм се аутоматски обавештава о догађајима који су се десили и може да на њих одреагује (кажемо да их обради). На пример, ако је корисник кликнуо мишем на неко место на прозору, могуће је да се на том месту прикаже одређена слика.
Програми које ћемо писати у почетку ће реаговати само на једну врсту догађаја - на догађај затварања прозора. Структура тих програма ће бити таква да ће се након иницијализације прозора и исцртавања садржаја у њему чекати да корисник искључи прозор, након чега ће се завршавати рад програма. Најкраћи начин да се то уради је следећи.
У склопу услова петље позивамо функцију pg.event.wait()
која чека
да се догоди наредни догађај и када се тај догађај догоди упоређује
његов тип са pg.QUIT
(тај тип представља догађај искључивања
прозора). Ако је тип догађаја који се десио различит од pg.QUIT
,
то значи да корисник још није искључио прозор, извршава се тело петље
које је заправо празно (не ради се ништа, а начин да се у језику
Python то постигне је да се наведе наредба pass
која не ради
ништа) и поново се прелази на проверу услова петље у ком се чека нови
догађај. Ако је тип догађаја баш pg.QUIT
то значи да је корисник
управо искључио прозор. Услов петље није више испуњен, петља се
прекида, након чега се извршава pg.quit()
и програм се завршава.
Прикажимо сада комплетан програм који уместо паузе од 5 секунди садржи и реаговање на догађаје.
Дакле, и овај најједноставнији пример употребе библиотеке PyGame
захтевао је неколико нетривијалних корака. Ипак, велики број програма
које ћемо писати у наставку имаће потпуно идентичну структуру и једини
део који ће се мењати биће онај у ком се врши цртање (у овом програму
то је део који се састоји од позива prozor.fill(...)
и затим
pg.draw.line(...)
).
Резиме¶
Резимирајмо на крају функционалност библиотеке коју смо до сада користили.
|
укључивање рада библиотеке |
|
искључивање рада библиотеке |
|
постављање наслова прозора |
|
укључивање прозора дате димензије |
|
враћа боју чији смо назив навели |
|
боји позадину прозора у дату боју |
|
црта дужи |
|
освежава приказ прозора |
|
паузира извршавање за дати број милисекунди |
|
чекање до наредног догађаја, који функција враћа |
|
врста догађаја |
|
догађај искључивања прозора |
Библиотека PygameBg¶
Програмски кôд на почетку и на крају програма се може прилично
скратити ако се користи библиотека PyGameBg (PyGame Toolbox for
Beginners by Petlja). Када се ова библиотека користи, довољно је да на
почетку позовеш функцију за отварање прозора pygamebg.open_window
којој наводиш редом ширину, висину и наслов прозора (два природна
броја и ниску), а да на крају програма позовеш функцију
pygamebg.wait_loop()
којом проузрокујеш да се цртеж прикаже у
прозору и да прозор остане приказан све док га корисник не искључи. Уз
коришћење ове библиотеке, претходни програм се може написати на
следећи начин.